import java.util.Scanner;

/**
 * 用于从用户输入中读取不同类型数据的工具类
 */
public class Read {

    private static Scanner sc = new Scanner(System.in);

    /**
     * 读取整数
     * @return 从用户输入读取的整数
     */
    public static int readInt(){
        return Integer.parseInt(sc.nextLine());
    }

    /**
     * 读取整数，如果输入为空，则返回默认值
     * @param defaultValue 默认值
     * @return 从用户输入读取的整数或默认值
     */
    public static int readInt(int defaultValue){
        String str = sc.nextLine();
        if(str.isEmpty()) return defaultValue;
        else return Integer.parseInt(str);
    }

    /**
     * 读取单个字符
     * @return 从用户输入读取的单个字符
     */
    public static char readChar(){
        return sc.nextLine().charAt(0);
    }

    /**
     * 读取单个字符，如果输入为空，则返回默认值
     * @param defaultValue 默认值
     * @return 从用户输入读取的单个字符或默认值
     */
    public static char readChar(char defaultValue){
        String str = sc.nextLine();
        if(str.isEmpty()) return defaultValue;
        else return str.charAt(0);
    }

    /**
     * 读取双精度浮点数
     * @return 从用户输入读取的双精度浮点数
     */
    public static double readDouble(){
        return Double.parseDouble(sc.nextLine());
    }

    /**
     * 读取双精度浮点数，如果输入为空，则返回默认值
     * @param defaultValue 默认值
     * @return 从用户输入读取的双精度浮点数或默认值
     */
    public static double readDouble(double defaultValue){
        String str = sc.nextLine();
        if(str.isEmpty()) return defaultValue;
        else return Double.parseDouble(str);
    }

    /**
     * 读取菜单选项，确保输入在1到6之间
     * @return 从用户输入读取的菜单选项
     */
    public static int readMenu(){
        while(true){
            int key = Integer.parseInt(sc.nextLine());
            if(key >= 1 && key <= 6) return key;
            else System.out.println("输入菜单编号错误");
        }
    }

    /**
     * 读取选择，只允许输入"Y"或"N"
     * @return 从用户输入读取的选择
     */
    public static int readSelect(){
        while (true){
            String str = sc.nextLine();
            if(str.isEmpty() || !(str.charAt(0) == 'Y' || str.charAt(0) == 'N')) System.out.println("请输入\"Y\" 或 \"N\"");
            else return str.charAt(0);
        }
    }

    /**
     * 读取字符串
     * @return 从用户输入读取的字符串
     */
    public static String readString(){
        return sc.nextLine();
    }

    /**
     * 读取字符串，如果输入为空，则返回默认值
     * @param defaultValue 默认值
     * @return 从用户输入读取的字符串或默认值
     */
    public static String readString(String defaultValue){
        String str = sc.nextLine();
        if(str.isEmpty()) return defaultValue;
        else return str;
    }
}
